#include "opencv_morphology.h"

#include<opencv2\opencv.hpp>   
#include<opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;

void doOpencvMorphology1()
{
	Mat img = imread("test.jpg");
	namedWindow("src", WINDOW_NORMAL);
	imshow("src", img);
	Mat out;
	//获取自定义核
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //第一个参数MORPH_RECT表示矩形的卷积核，当然还可以选择椭圆形的、交叉型的
	//膨胀操作
	dilate(img, out, element);
	namedWindow("dilate", WINDOW_NORMAL);
	imshow("dilate", out);
	waitKey(0);

}


void doOpencvMorphology2()
{
	Mat img = imread("test.jpg");
	namedWindow("src", WINDOW_NORMAL);
	imshow("src", img);
	Mat out;
	//获取自定义核
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //第一个参数MORPH_RECT表示矩形的卷积核，当然还可以选择椭圆形的、交叉型的
	//腐蚀操作
	erode(img, out, element);
	namedWindow("erode", WINDOW_NORMAL);
	imshow("erode", out);
	waitKey(0);

}



void doOpencvMorphology3()
{
	Mat img = imread("test.jpg");
	namedWindow("src", WINDOW_NORMAL);
	imshow("src", img);
	Mat out;
	//获取自定义核
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //第一个参数MORPH_RECT表示矩形的卷积核，当然还可以选择椭圆形的、交叉型的

	//高级形态学处理，调用这个函数就可以了，具体要选择哪种操作，就修改第三个参数就可以了。这里演示的是形态学梯度处理
	morphologyEx(img, out, MORPH_OPEN, element);
	namedWindow("morphologyEx_open", WINDOW_NORMAL);
	imshow("morphologyEx_open", out);
	waitKey(0);

}




void doOpencvMorphology4()
{
	Mat img = imread("test.jpg");
	namedWindow("src", WINDOW_NORMAL);
	imshow("src", img);
	Mat out;
	//获取自定义核
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //第一个参数MORPH_RECT表示矩形的卷积核，当然还可以选择椭圆形的、交叉型的

	//高级形态学处理，调用这个函数就可以了，具体要选择哪种操作，就修改第三个参数就可以了。这里演示的是形态学梯度处理
	morphologyEx(img, out, MORPH_CLOSE, element);
	namedWindow("morphologyEx_close", WINDOW_NORMAL);
	imshow("morphologyEx_close", out);
	waitKey(0);

}


void doOpencvMorphology5()
{
	Mat img = imread("test.jpg");
	namedWindow("src", WINDOW_NORMAL);
	imshow("src", img);
	Mat out;
	//获取自定义核
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //第一个参数MORPH_RECT表示矩形的卷积核，当然还可以选择椭圆形的、交叉型的

	//高级形态学处理，调用这个函数就可以了，具体要选择哪种操作，就修改第三个参数就可以了。这里演示的是形态学梯度处理
	morphologyEx(img, out, MORPH_GRADIENT, element);
	namedWindow("morphologyEx_GRADIENT", WINDOW_NORMAL);
	imshow("morphologyEx_GRADIENT", out);
	waitKey(0);

}

void doOpencvMorphology6()
{
	Mat img = imread("test.jpg");
	namedWindow("src", WINDOW_NORMAL);
	imshow("src", img);
	Mat out;
	//获取自定义核
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //第一个参数MORPH_RECT表示矩形的卷积核，当然还可以选择椭圆形的、交叉型的

	//高级形态学处理，调用这个函数就可以了，具体要选择哪种操作，就修改第三个参数就可以了。这里演示的是形态学梯度处理
	morphologyEx(img, out, MORPH_TOPHAT, element);
	namedWindow("morphologyEx_tophat", WINDOW_NORMAL);
	imshow("morphologyEx_tophat", out);
	waitKey(0);

}


void doOpencvMorphology7()
{
	Mat img = imread("test.jpg");
	namedWindow("src", WINDOW_NORMAL);
	imshow("src", img);
	Mat out;
	//获取自定义核
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //第一个参数MORPH_RECT表示矩形的卷积核，当然还可以选择椭圆形的、交叉型的

	//高级形态学处理，调用这个函数就可以了，具体要选择哪种操作，就修改第三个参数就可以了。这里演示的是形态学梯度处理
	morphologyEx(img, out, MORPH_BLACKHAT, element);
	namedWindow("morphologyEx_blackhat", WINDOW_NORMAL);
	imshow("morphologyEx_blackhat", out);
	waitKey(0);

}
